<<<<<<< .mine
package su.fishr.effects 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObjectContainer;
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Rectangle;
	import flash.utils.Timer;
	import su.fishr.effects.flySquares.CFlySquares;

	
	
	
	
	/**
	 * 
	 * <p>
	 * 		<b>FlySquares</b> - плагин-эффект создающий объект обеспечивающий
	 *     специфический эффект,
	 *      который заключается в том, что этот объект нарезает полученный в
	 *      аргументах DisplayObject, или его любой наследник, на фрагменты
	 *      заданного размера, затем "разбрасывает" их по сцене и используя 
	 *      TweenMax-эффекты собирает фрагменты двигая их к соответствующей
	 *      позиции.
	 * </p>
	 * <p>
	 *      Плагин может быть использован для создания эффекта-заставки,
	 *      а также может использоваться в качестве информера загрузки так как
	 *      умеет принимать в качестве аргумента число в диапазоне от 0 до 100 
	 *      и в зависимости от этого числа выводить на сцену пропорционально 
	 *      соответствующее кол-во фрагментов.
	 *      Может быть, так же, использовано в любом другом качестве на которое
	 *      хватит вашей фантазии :).
	 *    
	 * </p>
	 * 
	 * <p>
	 * 		Класс <b><code>FlySquares()</code></b> является главным классом плагин-эффекта
	 * 		имеет два обязательных параметра: отображаемый объект - любой
	 * 		потомок DisplayObject с размерами не превышающими максимальные, указанные в док-ции
	 *      к DisplayObject-ам,
	 *      с открытым доступом к пикселам, а также целочисленный размер 
	 *      стороны фрагмента (<i>не обязательно для режима отладки, см. использование
	 *      метода <code>configMode()</code></i>),  фрагменты имеют квадратную форму, поэтому 
	 *      размер стороны , фактически, определяет размер фрагмента.
	 * </p>
	 * 		<i>Пример простейшего использования:</i>
	 * <pre>
	 * 	<code>
	 * 		import su.fishr.effects.FlySquares
	 * 		...
	 * 		private var _flySquares:FlySquares = new FlySquares(myPicter, 25, true, true);
	 * 		this.addChild(_flySquares);
	 * 
	 * 		_flySquares.progress = 100;
	 *  </code>
	 * </pre>
	 * 
	 * <p>
	 * 
	 *      Плагин имеет два основных режима работы. Первый - обычный, в этом режиме плагин
	 *      будет работать включенным в состав какого либо приложения. Второй - режим отладки. Этот режим
	 *      позволяет путем тестирования выбрать набор основных настроек (в частности установить баланс: 
	 *      размер фрагмента/производительность флеш-плеера) для "обычного" режима. Режим отладки 
	 *      активируется обращением к методу <code>configMode()</code>. Приложение в этом режиме
	 *      автоматически увеличивает, через равные промежутки времени, своё свойство <code>progress</code>
	 *      складывая на сцене из фрагментов призвольного размера (заданного для текущего цикла), 
	 * 		из выбранного диапазона (см. configMode()), первоначальное изображение, закончив цикл, 
	 * 		делает небольшую паузу и перезапускается. Если включена опция выводит трейс основных параметров 
	 * 		текущего цикла.
	 * 		В режиме отладки приложение перезапускается, так же, по клику на
	 *      складываемом изображении для сокращения паузы между изменением стартовых параметров.
	 * </p>
	 * <p>
	 * 		<b>Внимание.</b> Плагин-эффект начинает работать не по добавлении на сцену, а при 
	 * 		изменении его свойства <code>progress (FlySquares.progress)</code>. Поэтому все
	 * 		предварительные настройки <code> (FlySquares.effectBomb(), FlySquares.createFilters()...)</code>
	 * 		должны быть выполенны до обращения к этому свойству, или методу <code>FlySquares.configMode()</code>.
	 * </p>
	 *		<i>Пример использования в режиме отладки:</i>
	 * <pre>
	 *  <code>
	 * 		import su.fishr.effects.FlySquares
	 * 		...
	 * 		private var _flySquares:FlySquares = new FlySquares(myPicter, 0, true, true);
	 * 		this.addChild(_flySquares);
	 *       
	 * 		_flySquares.configMode( 10, 50, true );
	 *  </code>
	 * </pre>
	 * <p> 
	 * 		<b>Примечания:</b> Для работы мини-приложения необходимо установить
	 * 		пакет эффектов от GreenSock (<a href='http://www.greensock.com' >http://www.greensock.com </a>)
	 * 		скачать можно <b><a href="http://www.greensock.com/as/greensock-as3.zip">здесь</a></b>.
	 * 
	 * <br>
	 * 		С условиями лицензии можно ознакомиться <b><a href="http://www.greensock.com/licensing/">здесь</a></b>.
	 *      Лицензия типа “No Charge”, <a href='http://www.greensock.com/terms_of_use.html' >TERMS OF USE</a>.
	 * </p>
	 * 
	 * 
	 * <a title="Become a member" alt="Become a member" href="http://www.greensock.com/" >
	 * 		<img class="logo" title="Become a member" alt="Become a member" id="greensock_member" src="../../../images/badge-i-use-tweenmax-108x54.gif" ></img>
	 * </a>
	 * 
	 * <p>
	 * 		<b>Ограничения.</b>     
	 *      Передача экр. объекта не содержащего матрицу (когда его свойство <code>.transform.matrix</code> равно null
	 *      вызовет ошибку на этапе исполнения.
	 *      При любых изменениях режима отображения экр. объекта, для того, чтобы эти изменения были учтены необходимо
	 *      создать новый экземпляр FlySquares и передать ему в параметрах измененный экр. объект.
	 * </p>
	 * 
	 * 
	 * 
	 * @version                             1.0
     * @playerversion                       Flash 9
     * @langversion                         3.0
     * @created                             22.06.2011 7:17
	 * @author fish_r
	 */
	public class FlySquares extends Sprite 
	{
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*							V A R I A B L E ' S 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		/**
		 * Константа <code>FLY_SQUARES_END</code> определяет значение 
		 * свойства <code>type</code> объекта события <code>flySquaresEnd</code>.
		 * <p>
		 * Событие отправляется в момент завершения работы плагина
		 * с изображением на сцене,
		 * когда <code>progress = 100</code> и переданная
		 * картинка полностью собрана из фрагментов и работа с ней
		 * закончена.
		 * После передачи этого события работа его, однако, не заканчивается
		 * полностью. Ещё некоторое время плагин, даже если на
		 * него нет ссылок, уничтожает фрагменты для освобождения
		 * занятой памяти.
		 * </p>
		 * 
		 */
		public const FLY_SQUARES_END:String = "flySquaresEnd";
		
		private var _dObject:DisplayObject;
		private var _configMode:Boolean = false;
		private var _sizeFragments:Object = new Object();
		private var _traceParam:Boolean = false;
		private var _cFlySquares:CFlySquares;
		private var _vFlySquares:DisplayObject;
		private var _progress:uint;
		private var _tStart:Timer;
		private var _tRestart:Timer;
		private var _vertical:Boolean;
		private var _minRnd:uint;
		private var _maxRnd:uint;
		private var _rate:Number;
		private var _strictMode:Boolean;
		private var _blackOff:Boolean;
		private var _vecSize:Array;
		private var _filtersArr:Array;
		private var _shiftObject:Rectangle;
		private var _effectBomb:Array;
		private var _distance:uint;
		
	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*					P R O P E R T I E S
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		/**
		 *  Текущий процент загрузки сообщаемый
		 * информеру. Целое, положительное число от 0 до 100.
		 * <p>
		 * <b>Примечание.</b>
		 * Если в ходе выполнения передаваемое занчение <code>progress</code> будет
		 * меньшим чем предидущее приложение перезапустится, так как посчитает,
		 * что началась новая загрузка.
		 * 
		 * </p>
		 * 
		 * 
		 */
		public function get progress():uint 
		{
			return _cFlySquares.progress;
		}
		
		public function set progress(value:uint):void 
		{
			_progress = value;

			if ( _cFlySquares.progress > _progress || _progress === 100 && _cFlySquares.progress === 100 )
			{   
				
				_cFlySquares.progress = 0;
				init();
				return;
			}
			
			if ( this.contains( _vFlySquares ) ) _cFlySquares.progress = _progress
			else start();
			
		}
		
		/**
		 *  Определяет размер стороны фрагмента. <br>
		 * Фрагменты переданного объекта имеют квадратную форму.
		 * То есть их стороны равны. Их размеры регулируются 
		 * этим параметром.
		 * <p>
		 * Если в режиме отладки 
		 * размер не задан явно, то он будет подобран случайным
		 * образом. Его значение можно будет получить
		 * в <code>trace</code> при включенном 
		 * <code>traceParam</code> при вызове метода 
		 * <code>configMode</code>
		 * </p>
		 * @private
		 */
		private function get sizeFragments():uint 
		{
			return _sizeFragments.size;
		}
		
		private function set sizeFragments(value:uint):void 
		{
			if ( value === 0 ) _sizeFragments.flag = true;
			_sizeFragments.size = value;
		}
		
		/**
		 * <code>Trace</code> основных параметров
		 * приложения.
		 *  В режиме отладки (при вызове метода 
		 * <code>configMode</code>)
		 * можно включить <code>trace</code> текущих основных параметров
		 * приложения.
		 * По умолчанию равно false. Если 
		 * сторона фрагмента не задана явно, её значение выбирается 
		 * случайно. Вывод основных параметров может помочь выбрать оптимальный размер 
		 * фрагмента.
		 */
		public function get traceParam():Boolean 
		{
			return _traceParam;
		}
		
		public function set traceParam(value:Boolean):void 
		{
			_traceParam = value;
		}
	
		/**
		 *  Режим формирования конечного
		 * изображения. Задается в конструкторе.
		 * По умолчанию <code>false</code>.
		 * Изображение складывается из фрагментов, 
		 * после заменяется оригинальным (не фрагментированным). 
		 * Значение true - строгий режим. 
		 * Оригинальное изображение подкладывается под складывающиеся 
		 * фрагменты по мере сложения рядов или строк 
		 * (в зависимости от направления "складывания"). 
		 * Если отображаемая часть FlySquares масштабируется на 
		 * сцене (растягивается или сжимается) возможно появление 
		 * артефактов в виде просвета между рядами и столбцами фрагментов. 
		 * Для того чтобы это устранить strictMode должен иметь значение true. 
		 * Включение этой опции крайне незначительно влияет на производительность, 
		 * но несколько изменяет визуальный эффект "складывания" фрагментов. 
		 */
		public function get strictMode():Boolean 
		{
			return _strictMode;
		}
		/**
		 *  Режим фильтрации по прозрачным 
		 * областям. 
		 *  В этой версии отключено
		 * @private
		 */
		public function get blackOff():Boolean 
		{
			return _blackOff;
		}
		/**
		 *  Свойства width и height объекта 
		 * FlySquares переопределены, в любой момент
		 * времени исполнения они равны аналогичным св-вам
		 * переданного экранного объекта. Это позволяет 
		 * правильно позиционировать объект FlySquares на
		 * сцене.
		 * Реальные значения свойств width и height
		 * можно узнать воспользовавшись свойством getBounds()
		 * объекта FlySquares.
		 */
		override public function get width():Number
		{
			return this.getChildAt(0).width;
		}
		
		/**
		 *  Свойства width и height объекта 
		 * FlySquares переопределены, в любой момент
		 * времени исполнения они равны аналогичным св-вам
		 * переданного экранного объекта. Это позволяет 
		 * правильно позиционировать объект FlySquares на
		 * сцене.
		 * Реальные значения свойств width и height
		 * можно узнать воспользовавшись свойством getBounds()
		 * объекта FlySquares.
		 */
		
		override public function get height():Number
		{
			return this.getChildAt(0).height;
		}
		
		/**@private**/
		public function get shiftObject():Rectangle 
		{
			return _shiftObject;
		}
		
		/**
		 * 
		 *  Определяет набор, фазу, порядок применения
		 * анимированных фильтров к фрагментам 
		 * складываемого изображения.
		 * <p>
		 * На различных этапах выполнения к некоторому 
		 * количеству фрагментов объекта FlySquares возможно 
		 * применение различных анимированных фильтров GreenSock.
		 * Массив передаваемый в аргументах методу определяет
		 * этот набор и величину той части фрагментов изображения
		 * к которым эти фильтры будут применены.
		 * 
		 * </p>
		 * На следующих этапах исполнения возможно применение
		 * анимированных фильтров:
		 * <ul>
		 * 
		 * 	<li>
		 * 		этап Bomb - С начала "разлета" частиц.
		 * 
		 * 	</li>
		 * 
		 * 
		 * 	<li>1 этап - Появление: С момента появления на сцене фрагмента и до момента
		 * 		останвоки движения фрагмента в конечной точке позиционирования.
		 * 		Длительность анимации равна значению параметра <code>rate</code>
		 * 		в секундах, переданному при инициализации экземпляра FlySquares
		 *  </li>
		 * 	<li>
		 * 		2 этап - Остановка: Фильтры применяются к фрагменту в момент остановки
		 *      его в кон. точке, без анимации - длительность анимации равна нуль.
		 * 	</li>
		 * <li>
		 * 		3 этап - Завершающий: Начинается применение фильтров с момента когда все фрагменты
		 *      заняли свои конечные позиции. В этом случае событие FLY_SQUARES_END генерируется
		 * 		только после окончания анимации наложения фильтров.
		 * 		Длительность анимации равна значению параметра <code>rate</code>
		 * 		в секундах, переданному при инициализации экземпляра FlySquares.
		 * </li>
		 * </ul>
		 *
		 * 
		 * В общем виде массив передаваемый при вызове метода
		 * состоит из следующих членов:
		 * <pre>
		 *  [0]:Number. Опеределяет часть фрагментов к которым будут применены группы фильтров.
		 *  [1]-[3]:Object. Хеш содержащий один или несколько объектов-фильтров сформированных
		 *                  по правилам объявления фильтров-плагинов GreenSock.
		 * </pre>
		 * 
		 * Этому свойству также может быть передан массив возвращаемый одним из методов
		 * класса <code>AssetFilters()</code>. См. также использование 
		 * 	<a href="AssetFilters.html">
		 * 		<code>AssetFilters()</code>
		 * 	</a>
		 * 
		 * @see AssetFilters()
		 */
		public function set createFilters(asset:Array):void
		{
				_filtersArr = asset;
		}

	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						C O N S T R U C T O R 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		
		/**
		 *  Создает новый экземпляр FlySquares.
		 *  
		 * Конструктор принимает два обязательных аргумента: ссылку на объект-изображение
		 * унаследовавшийся от DisplayObject, размер стороны фрагмента (целое, положительное число).
		 * 
		 * <p>
		 * 			<b>Примечание</b>
		 * 	В режиме отладки (режим отладки включается автоматически при обращении к методу configMode())
		 * значение параметра size может равняться нуль. В этом случае размер фрагмента
		 * будет выбираться из указанного при вызове метода configMode() диапазона,
		 * либо полностью произвольно от значения 1 до значения равного минимальной стороне обрабатываемого
		 * изображения, если диапазон указан не был.
		 * Если же при вызове конструктора был указан размер стороны фрагмента числом большим чем нуль 
		 * то, даже в режиме отладки, размеры фрагментов изображений будут равняться  переданному в параметрах
		 * в конструктор.
		 * 
		 * </p>
		 * 
		 * 
		 * 
		 * @param	object 		отображаемый объект, любой из расширящих DisplayObject с открытым доступом к пикселам.
		 * @param	size		размер стороны фрагмента в пикселах, целое, положительное число отличное от нуль (кроме 
		 * 						режима отладки).
		 * @param	distance	максимальное расстояние разлета фрагментов
		 * @param	rate		время движения каждого фрагмента к своей конечной позиции (выражается в секундах, целым или десятичным числом).
		 * @param	vertical	направление "складывания" фрагментов. По умолчанию <code>false</code> - слева направо, <code>true</code> - снизу вверх.
		 * @param	strictMode  определяет режим формирования отображаемого объекта. Значение по умолчанию: <code>false</code> - нормальный,
		 *                      изображение складывается из фрагментов, после заменяется оригинальным (не фрагментированным).
		 *                      Значение <code>true</code> - строгий режим. Оригинальное изображение подкладывается под складывающиеся
		 *                      фрагменты по мере сложения рядов или строк (в зависимости от направления "складывания").
		 * 						Если отображаемая часть FlySquares масштабируется на сцене (растягивается или сжимается)
		 * 						возможно появление артефактов в виде просвета между рядами и столбцами фрагментов. Для того
		 * 						чтобы это устранить <code>strictMode</code> должен иметь значение <code>true</code>. 
		 * 						Включение этой опции крайне незначительно влияет на производительность, но несколько изменяет
		 * 						визуальный эффект "складывания" фрагментов.
		 * 						
		 * 
		 *                      
		 * <p>
		 * <b>Внимание!</b> при большом кол-ве фрагментов производительность флеш-плеера может падать до 0.
		 * </p>
		 * 
		 */
		
		public function FlySquares(object:DisplayObject, size:uint, distance:uint = 300, rate:Number = 1, vertical:Boolean = false, strictMode:Boolean = false) 
		{

			super();

			_strictMode = strictMode;
			_rate = rate;
			if ( _rate < 0 ) _rate = 0;
			
			_vertical = vertical;
			_distance = distance;
			
			_dObject = object;
			///добавляю шейп по форме переданного ДО
			///для немедленного придания размера 
			///приложению
			createShape();

			this.sizeFragments = size;
			
			///TODO Отключена фильтрация прозрачных областей
			///_blackOff = blackOff;

			init();
			
		}
		
		/**
		 *  Включает "эффект бомбы". Обращение к методу
		 * должно быть выполнено до первого изменения свойства
		 * <code>progress</code>
		 * 
		 * @param	delay задержка перед выполенением.
		 * @param	duration длительность выполенения (если равна нуль, длительность выполнения
		 * 			будет равна параметру rate указанному при создании объекта FlySquares
		 * @param	easing ссылка на один из объектов пакета com.greensock.easing (напр. <code> Back.easeOut </code>)
		 */
		public function effectBomb(delay:Number, duration:Number = 0, easing:Object = null ):void
		{
			_effectBomb = new Array( delay, duration, easing );
			
		}
		
	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						I N I T A L I Z E 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		
		private function init(e:Event=null):void 
		{
			if (_vFlySquares && this.contains(_vFlySquares) ) this.removeChild(_vFlySquares);
			if ( _cFlySquares ) _cFlySquares.removeEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
			_cFlySquares = null;
			_vFlySquares = null;
			
			/**
			 *  Если это повторный запуск приложения ( в режиме отладки)
			 * останавливаем таймер паузы перед повторным
			 * запуском. 
			 */
			if ( _tRestart )
			{
				_tRestart.reset();
				_tRestart.stop();
				_tRestart.removeEventListener(TimerEvent.TIMER, init);
			}

			_cFlySquares = new CFlySquares(_dObject, _sizeFragments.size, this, _distance, _shiftObject);
			
			_vFlySquares = _cFlySquares.vFlySquares;
			_cFlySquares.rate = _rate;
			_cFlySquares.vertical = _vertical;
			
			

			if ( _configMode === true ) initalConfigMode();
			
			if ( _progress > 0 ) start();

		}
		
		
		
		private function start(e:Event = null):void 
		{
			if ( _sizeFragments.size <= 0 && _configMode === false )
			{
				throw new Error(". FlySquares. Ошибка исполнения : " +
					" в рабочем режиме значение свойства размера стороны фрагмента " +
					" должно быть выражено положительным, целым числом отличным от нуль.");
				
				return;
			}
			_cFlySquares.onBomb = _effectBomb;
			_cFlySquares.arrayFilters = _filtersArr;
			this.addChild(_vFlySquares);
			
			
			_shiftObject = _cFlySquares.shiftObject;
			_dObject = _cFlySquares.dObject;
			
			this.addEventListener( Event.REMOVED_FROM_STAGE, removeFromStageListener);
			
			this.progress = _progress;
			_cFlySquares.addEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
		}
		


		
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*							C O N F I G   M O D E  	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/	
		
		/**
		 *  Включает режим отладки. 
		 * <p>
		 *    Режим отладки позволяет выбрать, методом подбора, следующие параметры: 
		 * <ul type = "circle" >
		 *   <li> размер фрагментов,</li>
		 *   <li> время перемещения фрагмента с позиции появления к конечной позиции.</li>
		 * 
		 * </ul>
		 * 
		 *    В режиме работы "отладка" приложение автоматически самозапускается и изменяет
		 * значение свойства <code>progress</code> увеличивая его на 1 каждые 20мс,
		 * после завершения цикла (когда значение <code>progress</code> будет равным
		 * 100-а) выдерживается пауза (равная заданному в параметрах конструктора значению <code>rate</code>) 
		 * и приложение перезапускается вновь.
		 *   Если при обращении к конструктору размер стороны фрагмента (парам.<code> size</code>) 
		 * был указан числом отличным от нуль то, в каждой итерации, в режиме отладки, фрагменты
		 * будут иметь размер указанный в параметрах при вызове конструктора. Для того, чтобы позволить
		 * приложению выбирать размер фрагмента из заданного диапазона (парам. <code>minRnd</code>,
		 *  <code>maxRnd</code>) размер стороны фрагмента (парам.<code> size</code>) при вызове конструктора
		 * должен быть равен 0 (нуль).
		 * </p>
		 * 
		 * <p>
		 *    Размер стороны фрагмента, в режиме отладки, изменяется от значения указанного в агрументе
		 * <code>minRnd</code> до значения указанного в арг. <code>maxRnd</code> с дискретностью равной
		 * 1/10 части указанного диапазона. То есть, если значение <code>minRnd</code> равно 1, а значение
		 * <code>maxRnd</code> равно 10, то в первой итерации размер стороны фрагмента будет равен 1 пикс.,
		 * во второй 2 пикс., в третьей 3 и т.д. Достигнув максимального значения стороны фрагмента,
		 * в следующей итерации сторона фрагмента будет равна, вновь, минимальному и далее, вновь, возрастать.
		 * 
		 * 
		 * </p>
		 * 
		 * 
		 * 
		 * @param	minRnd минимальный размер стороны фрагмента ,
		 * @param	maxRnd максимальный размер стороны фрагмента ,
		 * @param	traceParam включить трансляцию основных параметров в трейс.
		 */
		public function configMode(minRnd:uint = 1, maxRnd:uint = 0, traceParam:Boolean = false):void
		{
			_traceParam = traceParam;
			_minRnd = minRnd;
			maxRnd === 0?_maxRnd = _dObject.width:_maxRnd = maxRnd;
			_configMode = true;
			
			_vecSize = selectRndSize();
			
			initalConfigMode();
		}
		
		

		
		/**
		 *  Инициализирует режим отладки при его активации
		 * и при каждой иттерации приложения.
		 */
		private function initalConfigMode():void
		{
			
			if (_sizeFragments.flag === true )
			{
				if ( _vecSize.length === 0 ) _vecSize = selectRndSize();
				_sizeFragments.size =_vecSize.shift() ;
				_cFlySquares.sizeFragments = _sizeFragments.size;
			}
				
				_vFlySquares.addEventListener(MouseEvent.CLICK, flySquaresClickListener);
				
				_tStart = new Timer(20);
				_tStart.addEventListener(TimerEvent.TIMER, timerListener);
				_tStart.start();
				if (_traceParam ) TraceParam();
				if ( !_tRestart ) _tRestart = new Timer(_rate * 1000);
		}
		
		private function selectRndSize():Array
		{
			///подбор диапазона случайных параметров
			var factor:int = 9;
			var unit:Number = ( _maxRnd - _minRnd ) / factor;
			var vecSize:Array = new Array();
			var value:Number = _minRnd;
			
			vecSize.push( value );
			
			while ( vecSize.length < factor )
			{
				value += unit;
				vecSize.push( value );

			}
			
			vecSize.push(_maxRnd);

			return vecSize;
		}
		
		private function TraceParam():void
		{
			
			////////////////////////// T R A C E ///////////////////////////////
			var d:Date = new Date();
			trace(" start time: " + d.valueOf() + "ms . FlySquares, TraceParam, _sizeFragments : " + this.sizeFragments +
			", progress : " + _progress + ", rate : " + _rate );
			//////////////////////// E N D  T R A C E //////////////////////////
		}
		
		/**
		 *  Пересоздание объекта по клику.
		 * Или удалению со сцены.
		 * @param	e
		 */
		
		private function flySquaresClickListener(e:MouseEvent = null):void 
		{
			_vFlySquares.removeEventListener(MouseEvent.CLICK, flySquaresClickListener);
			_tStart.removeEventListener(TimerEvent.TIMER, timerListener);
			_tStart.reset();
			_tStart = null;
			
			
			init();
		}
		
		
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*								E N D  O F F 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
	
		private function removeFromStageListener(e:Event):void 
		{
			removeEventListener(Event.REMOVED_FROM_STAGE, removeFromStageListener);
			_cFlySquares.removeEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
			_vFlySquares.removeEventListener(MouseEvent.CLICK, flySquaresClickListener);
		}
		
		
		private function endPlayListener(e:Event):void 
		{
			_cFlySquares.removeEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
			
			if ( _configMode === true )
			{
				_tRestart.start();
				_tRestart.addEventListener(TimerEvent.TIMER, init);
				this.dispatchEvent(new Event(FLY_SQUARES_END));
			}
			else
			{
				this.dispatchEvent(new Event(FLY_SQUARES_END));
			}
			
			return;
		}
		
		private function timerListener(e:TimerEvent):void 
		{
			
			this.progress ++;
			
			if ( this.progress >= 100 ) {
				_progress = 0;
				_tStart.reset();
				_tStart.removeEventListener(TimerEvent.TIMER, timerListener);
				
				return;
			}
			
			
		}
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*					S E C O N D A R  Y   F U N C T I O N ' S  	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		
		private function createShape():void
		{
			var rect:Rectangle = _dObject.getBounds(this);
			var shape:Shape = new Shape();
			shape.graphics.beginFill(0x000000, 0);
			shape.graphics.drawRect( rect.x, rect.y, rect.width, rect.height );
			this.addChild(shape);
		}
		
		
		
	}

}=======
package su.fishr.effects 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObjectContainer;
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Rectangle;
	import flash.utils.Timer;
	import su.fishr.effects.flySquares.CFlySquares;

	
	
	
	
	/**
	 * 
	 * <p>
	 * 		<b>FlySquares</b> - плагин-эффект создающий объект обеспечивающий
	 *     специфический эффект,
	 *      который заключается в том, что этот объект нарезает полученный в
	 *      аргументах DisplayObject, или его любой наследник, на фрагменты
	 *      заданного размера, затем "разбрасывает" их по сцене и используя 
	 *      TweenMax-эффекты собирает фрагменты двигая их к соответствующей
	 *      позиции.
	 * </p>
	 * <p>
	 *      Плагин может быть использован для создания эффекта-заставки,
	 *      а также может использоваться в качестве информера загрузки так как
	 *      умеет принимать в качестве аргумента число в диапазоне от 0 до 100 
	 *      и в зависимости от этого числа выводить на сцену пропорционально 
	 *      соответствующее кол-во фрагментов.
	 *      Может быть, так же, использовано в любом другом качестве на которое
	 *      хватит вашей фантазии :).
	 *    
	 * </p>
	 * 
	 * <p>
	 * 		Класс <b><code><b>FlySquares</b>()</code></b> является главным классом плагин-эффекта
	 * 		имеет два обязательных параметра: отображаемый объект - любой
	 * 		потомок DisplayObject с размерами не превышающими максимальные, указанные в док-ции
	 *      к DisplayObject-ам,
	 *      с открытым доступом к пикселам, а также целочисленный размер 
	 *      стороны фрагмента (<i>не обязательно для режима отладки, см. использование
	 *      метода <code>configMode()</code></i>),  фрагменты имеют квадратную форму, поэтому 
	 *      размер стороны , фактически, определяет размер фрагмента.
	 * </p>
	 * <p>
	 * 
	 *      Плагин имеет два основных режима работы. Первый - обычный, в этом режиме плагин
	 *      будет работать включенным в состав какого либо приложения. Второй - режим отладки. Этот режим
	 *      позволяет путем тестирования выбрать набор основных настроек (в частности установить баланс: 
	 *      размер фрагмента/производительность флеш-плеера) для "обычного" режима. Режим отладки 
	 *      активируется обращением к методу <code>configMode()</code>. Приложение в этом режиме
	 *      автоматически увеличивает, через равные промежутки времени, своё свойство <code>progress</code>
	 *      складывая на сцене из фрагментов призвольного размера (заданного для текущего цикла), 
	 * 		из выбранного диапазона (см. configMode()), первоначальное изображение, закончив цикл, 
	 * 		делает небольшую паузу и перезапускается. Если включена опция выводит трейс основных параметров 
	 * 		текущего цикла.
	 * 		В режиме отладки приложение перезапускается, так же, по клику на
	 *      складываемом изображении для сокращения паузы между изменением стартовых параметров.
	 * </p>
	 * <p>
	 * 		<b>Внимание.</b> Плагин-эффект начинает работать не по добавлении на сцену, а при 
	 * 		изменении его свойства <code>progress (<b>FlySquares</b>.progress)</code>. Поэтому все
	 * 		предварительные настройки <code> (<b>FlySquares</b>.effectBomb()...)</code>
	 * 		должны быть выполенны до обращения к этому свойству, или методу <code><b>FlySquares</b>.configMode()</code>.
	 * </p>
	 * <p> 
	 * 		<b>Примечания:</b> Для работы мини-приложения необходимо установить
	 * 		пакет эффектов от GreenSock (<a href='http://www.greensock.com' >http://www.greensock.com </a>)
	 * 		скачать можно <b><a href="http://www.greensock.com/as/greensock-as3.zip">здесь</a></b>.
	 * 
	 * <br>
	 * 		С условиями лицензии можно ознакомиться <b><a href="http://www.greensock.com/licensing/">здесь</a></b>.
	 *      Лицензия типа “No Charge”, <a href='http://www.greensock.com/terms_of_use.html' >TERMS OF USE</a>.
	 * 		
	 * </p>
	 * 
	 * 
	 * <a title="Become a member" alt="Become a member" href="http://www.greensock.com/" >
	 * 		<img class="logo" title="Become a member" alt="Become a member" id="greensock_member" src="../../../images/badge-i-use-tweenmax-108x54.gif" ></img>
	 * </a>
	 * <p>
	 * 		<b>Ограничения.</b>     
	 *      Передача экр. объекта не содержащего матрицу (когда его свойство <code>.transform.matrix</code> равно null
	 *      вызовет ошибку на этапе исполнения.
	 *      При любых изменениях режима отображения экр. объекта, для того, чтобы эти изменения были учтены необходимо
	 *      создать новый экземпляр <b>FlySquares</b> и передать ему в параметрах измененный экр. объект.
	 * </p>
	 * 
	 * 
	 * 	@example	<i>Пример использования:</i>
	 * <listing version="3.0">
	 *   private function flySquaresSimple(obj:DisplayObject):void 
	 *	{
	 *		var flySquares:FlySquares = new FlySquares( obj, 10, 2, false, true, 200 );
	 *		this.addChild( flySquares );
	 *		flySquares.progress = 100;
	 *	}
	 * </listing>
	 * 
	 * @example 	<i>Пример использования в режиме отладки:</i>
	 * <listing version="3.0">
	 *	private function flySquaresConfigMode(obj:DisplayObject):void 
	 *	{
	 *		var flySquares:FlySquares = new FlySquares( obj, 10, 1, true, false );
	 *		this.addChild( flySquares  );
	 *		flySquares.configMode( 3, 15, true);
	 *		
	 *	}
	 * 
	 * </listing>
	 * 
	 * @example <i>Пример использования с эффектом "bomb"</i>
	 * <listing version="3.0">
	 *  private function flySquaresEffectBomb(obj:DisplayObject):void 
	 *	{
	 *		var flySquares:FlySquares = new FlySquares( obj, 2, 1, false, false, 400 );
	 *		this.addChild( flySquares  );
	 *		flySquares.effectBomb( 1, 4, Cubic.easeOut);
	 *		flySquares.progress = 100;
	 *		
	 *	}
	 * </listing>
	 * 
	 * 
	 * @version                             2.0
     * @playerversion                       Flash 9
     * @langversion                         3.0
     * @created                             22.06.2011 7:17
	 * @author fish_r
	 * 
	 * @see http://www.greensock.com/as/docs/tween/index.html
	 * @see http://code.google.com/p/fishr
	 * 
	 * 
	 */
	public class FlySquares extends Sprite 
	{
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*							V A R I A B L E ' S 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		/**
		 * Константа <code>FLY_SQUARES_END</code> определяет значение 
		 * свойства <code>type</code> объекта события <code><b>FlySquares</b>End</code>.
		 * <p>
		 * Событие отправляется в момент завершения работы плагина
		 * с изображением на сцене,
		 * когда <code>progress = 100</code> и переданная
		 * картинка полностью собрана из фрагментов и работа с ней
		 * закончена.
		 * После передачи этого события работа его, однако, не заканчивается
		 * полностью. Ещё некоторое время плагин, даже если на
		 * него нет ссылок, уничтожает фрагменты для освобождения
		 * занятой памяти.
		 * </p>
		 * 
		 */
		public const FLY_SQUARES_END:String = "flySquaresEnd";
		
		private var _dObject:DisplayObject;
		private var _configMode:Boolean = false;
		private var _sizeFragments:Object = new Object();
		private var _traceParam:Boolean = false;
		private var _cFlySquares:CFlySquares;
		private var _vFlySquares:DisplayObject;
		private var _progress:uint;
		private var _tStart:Timer;
		private var _tRestart:Timer;
		private var _vertical:Boolean;
		private var _minRnd:uint;
		private var _maxRnd:uint;
		private var _rate:Number;
		private var _strictMode:Boolean;
		private var _blackOff:Boolean;
		private var _vecSize:Array;
		private var _shiftObject:Rectangle;
		private var _effectBomb:Array;
		private var _distance:uint;
		
	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*					P R O P E R T I E S
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		/**
		 *  Текущий процент загрузки сообщаемый
		 * информеру. Целое, положительное число от 0 до 100.
		 * <p>
		 * <b>Примечание.</b>
		 * Если в ходе выполнения передаваемое занчение <code>progress</code> будет
		 * меньшим чем предидущее приложение перезапустится, так как посчитает,
		 * что началась новая загрузка.
		 * 
		 * </p>
		 * 
		 * 
		 */
		public function get progress():uint 
		{
			return _cFlySquares.progress;
		}
		
		public function set progress(value:uint):void 
		{
			_progress = value;

			if ( _cFlySquares.progress > _progress || _progress === 100 && _cFlySquares.progress === 100 )
			{   
				
				_cFlySquares.progress = 0;
				init();
				return;
			}
			
			if ( this.contains( _vFlySquares ) ) _cFlySquares.progress = _progress
			else start();
			
		}
		
		/**
		 *  Определяет размер стороны фрагмента. <br>
		 * Фрагменты переданного объекта имеют квадратную форму.
		 * То есть их стороны равны. Их размеры регулируются 
		 * этим параметром.
		 * <p>
		 * Если в режиме отладки 
		 * размер не задан явно, то он будет подобран случайным
		 * образом. Его значение можно будет получить
		 * в <code>trace</code> при включенном 
		 * <code>traceParam</code> при вызове метода 
		 * <code>configMode</code>
		 * </p>
		 * @private
		 */
		private function get sizeFragments():uint 
		{
			return _sizeFragments.size;
		}
		
		private function set sizeFragments(value:uint):void 
		{
			if ( value === 0 ) _sizeFragments.flag = true;
			_sizeFragments.size = value;
		}
		
		/**
		 * <code>Trace</code> основных параметров
		 * приложения.
		 *  В режиме отладки (при вызове метода 
		 * <code>configMode</code>)
		 * можно включить <code>trace</code> текущих основных параметров
		 * приложения.
		 * По умолчанию равно false. Если 
		 * сторона фрагмента не задана явно, её значение выбирается 
		 * случайно. Вывод основных параметров может помочь выбрать оптимальный размер 
		 * фрагмента.
		 */
		public function get traceParam():Boolean 
		{
			return _traceParam;
		}
		
		public function set traceParam(value:Boolean):void 
		{
			_traceParam = value;
		}
	
		/**
		 *  Режим формирования конечного
		 * изображения. Задается в конструкторе.
		 * По умолчанию <code>false</code>.
		 * Изображение складывается из фрагментов, 
		 * после заменяется оригинальным (не фрагментированным). 
		 * Значение true - строгий режим. 
		 * Оригинальное изображение подкладывается под складывающиеся 
		 * фрагменты по мере сложения рядов или строк 
		 * (в зависимости от направления "складывания"). 
		 * Если отображаемая часть <b>FlySquares</b> масштабируется на 
		 * сцене (растягивается или сжимается) возможно появление 
		 * артефактов в виде просвета между рядами и столбцами фрагментов. 
		 * Для того чтобы это устранить strictMode должен иметь значение true. 
		 * Включение этой опции крайне незначительно влияет на производительность, 
		 * но несколько изменяет визуальный эффект "складывания" фрагментов. 
		 */
		public function get strictMode():Boolean 
		{
			return _strictMode;
		}
		/**
		 *  Режим фильтрации по прозрачным 
		 * областям. 
		 *  В этой версии отключено
		 * @private
		 */
		public function get blackOff():Boolean 
		{
			return _blackOff;
		}
		/**
		 *  Свойства width и height объекта 
		 * <b>FlySquares</b> переопределены, в любой момент
		 * времени исполнения они равны аналогичным св-вам
		 * переданного экранного объекта. Это позволяет 
		 * правильно позиционировать объект <b>FlySquares</b> на
		 * сцене.
		 * Реальные значения свойств width и height
		 * можно узнать воспользовавшись свойством getBounds()
		 * объекта <b>FlySquares</b>.
		 */
		override public function get width():Number
		{
			return this.getChildAt(0).width;
		}
		
		/**
		 *  Свойства width и height объекта 
		 * <b>FlySquares</b> переопределены, в любой момент
		 * времени исполнения они равны аналогичным св-вам
		 * переданного экранного объекта. Это позволяет 
		 * правильно позиционировать объект <b>FlySquares</b> на
		 * сцене.
		 * Реальные значения свойств width и height
		 * можно узнать воспользовавшись свойством getBounds()
		 * объекта <b>FlySquares</b>.
		 */
		
		override public function get height():Number
		{
			return this.getChildAt(0).height;
		}
		
		/**@private**/
		public function get shiftObject():Rectangle 
		{
			return _shiftObject;
		}

	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						C O N S T R U C T O R 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		
		/**
		 *  Создает новый экземпляр <b>FlySquares</b>.
		 *  
		 * Конструктор принимает два обязательных аргумента: ссылку на объект-изображение
		 * унаследовавшийся от DisplayObject, размер стороны фрагмента (целое, положительное число).
		 * 
		 * <p>
		 * 			<b>Примечание</b>
		 * 	В режиме отладки (режим отладки включается автоматически при обращении к методу configMode())
		 * значение параметра size может равняться нуль. В этом случае размер фрагмента
		 * будет выбираться из указанного при вызове метода configMode() диапазона,
		 * либо полностью произвольно от значения 1 до значения равного минимальной стороне обрабатываемого
		 * изображения, если диапазон указан не был.
		 * Если же при вызове конструктора был указан размер стороны фрагмента числом большим чем нуль 
		 * то, даже в режиме отладки, размеры фрагментов изображений будут равняться  переданному в параметрах
		 * в конструктор.
		 * 
		 * </p>
		 * 
		 * 
		 * 
		 * @param	object 		отображаемый объект, любой из расширящих DisplayObject с открытым доступом к пикселам.
		 * @param	size		размер стороны фрагмента в пикселах, целое, положительное число отличное от нуль (кроме 
		 * 						режима отладки).
		 * @param	rate		время движения каждого фрагмента к своей конечной позиции (выражается в секундах, целым или десятичным числом).
		 * @param	vertical	направление "складывания" фрагментов. По умолчанию <code>false</code> - слева направо, <code>true</code> - снизу вверх.
		 * @param	strictMode  определяет режим формирования отображаемого объекта. Значение по умолчанию: <code>false</code> - нормальный,
		 *                      изображение складывается из фрагментов, после заменяется оригинальным (не фрагментированным).
		 *                      Значение <code>true</code> - строгий режим. Оригинальное изображение подкладывается под складывающиеся
		 *                      фрагменты по мере сложения рядов или строк (в зависимости от направления "складывания").
		 * 						Если отображаемая часть <b>FlySquares</b> масштабируется на сцене (растягивается или сжимается)
		 * 						возможно появление артефактов в виде просвета между рядами и столбцами фрагментов. Для того
		 * 						чтобы это устранить <code>strictMode</code> должен иметь значение <code>true</code>. 
		 * 						Включение этой опции крайне незначительно влияет на производительность, но несколько изменяет
		 * 						визуальный эффект "складывания" фрагментов.
		 * @param	distance	максимальное расстояние разлета фрагментов
		 * 						
		 * 
		 *                      
		 * <p>
		 * <b>Внимание!</b> при большом кол-ве фрагментов производительность флеш-плеера может падать до 0.
		 * </p>
		 * 
		 */
		
		public function FlySquares(object:DisplayObject, size:uint, rate:Number = 1, vertical:Boolean = false, strictMode:Boolean = false, distance:uint = 300) 
		{

			super();

			_strictMode = strictMode;
			_rate = rate;
			if ( _rate < 0 ) _rate = 0;
			
			_vertical = vertical;
			_distance = distance;
			
			_dObject = object;
			///добавляю шейп по форме переданного ДО
			///для немедленного придания размера 
			///приложению
			createShape();

			this.sizeFragments = size;
			
			///TODO Отключена фильтрация прозрачных областей
			///_blackOff = blackOff;

			init();
			
		}
		
		/**
		 *  Включает "эффект бомбы". Обращение к методу
		 * должно быть выполнено до первого изменения свойства
		 * <code>progress</code>
		 * 
		 * @param	delay задержка перед выполенением.
		 * @param	duration длительность выполенения (если равна нуль, длительность выполнения
		 * 			будет равна параметру rate указанному при создании объекта <b>FlySquares</b>
		 * @param	easing ссылка на один из объектов пакета com.greensock.easing (напр. <code> Back.easeOut </code>)
		 * 
		 * 
		 * @example <i>Пример использования с эффектом "bomb"</i>
		 * <listing version="3.0">
		 *  private function flySquaresEffectBomb(obj:DisplayObject):void 
		 *	{
		 *		var flySquares:FlySquares = new FlySquares( obj, 2, 1, false, false, 400 );
		 *		this.addChild( flySquares  );
		 *		flySquares.x = flySquares.width &#42; 2;
		 *		flySquares.effectBomb( 1, 4, Cubic.easeOut);
		 *		flySquares.progress = 100;
		 *		
		 *	}
		 * </listing>
		 */
		public function effectBomb(delay:Number, duration:Number = 0, easing:Object = null ):void
		{
			_effectBomb = new Array( delay, duration, easing );
			
		}
		
	
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*						I N I T A L I Z E 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		
		private function init(e:Event=null):void 
		{
			if (_vFlySquares && this.contains(_vFlySquares) ) this.removeChild(_vFlySquares);
			if ( _cFlySquares ) _cFlySquares.removeEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
			_cFlySquares = null;
			_vFlySquares = null;
			
			/**
			 *  Если это повторный запуск приложения ( в режиме отладки)
			 * останавливаем таймер паузы перед повторным
			 * запуском. 
			 */
			if ( _tRestart )
			{
				_tRestart.reset();
				_tRestart.stop();
				_tRestart.removeEventListener(TimerEvent.TIMER, init);
			}

			_cFlySquares = new CFlySquares(_dObject, _sizeFragments.size, this, _distance, _shiftObject);
			
			_vFlySquares = _cFlySquares.vFlySquares;
			_cFlySquares.rate = _rate;
			_cFlySquares.vertical = _vertical;
			
			

			if ( _configMode === true ) initalConfigMode();
			
			if ( _progress > 0 ) start();

		}
		
		
		
		private function start(e:Event = null):void 
		{
			if ( _sizeFragments.size <= 0 && _configMode === false )
			{
				throw new Error(". FlySquares. Ошибка исполнения : " +
					" в рабочем режиме значение свойства размера стороны фрагмента " +
					" должно быть выражено положительным, целым числом отличным от нуль.");
				
				return;
			}
			_cFlySquares.onBomb = _effectBomb;
			this.addChild(_vFlySquares);
			_shiftObject = _cFlySquares.shiftObject;
			_dObject = _cFlySquares.dObject;
			
			this.addEventListener( Event.REMOVED_FROM_STAGE, removeFromStageListener);
			
			this.progress = _progress;
			_cFlySquares.addEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
		}
		


		
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*							C O N F I G   M O D E  	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/	
		
		/**
		 *  Включает режим отладки. 
		 * <p>
		 *    Режим отладки позволяет выбрать, методом подбора, следующие параметры: 
		 * <ul type = "circle" >
		 *   <li> размер фрагментов,</li>
		 *   <li> время перемещения фрагмента с позиции появления к конечной позиции.</li>
		 * 
		 * </ul>
		 * 
		 *    В режиме работы "отладка" приложение автоматически самозапускается и изменяет
		 * значение свойства <code>progress</code> увеличивая его на 1 каждые 20мс,
		 * после завершения цикла (когда значение <code>progress</code> будет равным
		 * 100-а) выдерживается пауза (равная заданному в параметрах конструктора значению <code>rate</code>) 
		 * и приложение перезапускается вновь.
		 *   Если при обращении к конструктору размер стороны фрагмента (парам.<code> size</code>) 
		 * был указан числом отличным от нуль то, в каждой итерации, в режиме отладки, фрагменты
		 * будут иметь размер указанный в параметрах при вызове конструктора. Для того, чтобы позволить
		 * приложению выбирать размер фрагмента из заданного диапазона (парам. <code>minRnd</code>,
		 *  <code>maxRnd</code>) размер стороны фрагмента (парам.<code> size</code>) при вызове конструктора
		 * должен быть равен 0 (нуль).
		 * </p>
		 * <p>
		 *    Размер стороны фрагмента, в режиме отладки, изменяется от значения указанного в агрументе
		 * <code>minRnd</code> до значения указанного в арг. <code>maxRnd</code> с дискретностью равной
		 * 1/10 части указанного диапазона. То есть, если значение <code>minRnd</code> равно 1, а значение
		 * <code>maxRnd</code> равно 10, то в первой итерации размер стороны фрагмента будет равен 1 пикс.,
		 * во второй 2 пикс., в третьей 3 и т.д. Достигнув максимального значения стороны фрагмента,
		 * в следующей итерации сторона фрагмента будет равна, вновь, минимальному и далее, вновь, возрастать.
		 * 
		 * 
		 * </p>
		 * 
		 * @example 	<i>Пример использования в режиме отладки:</i>
		 * <listing version="3.0">
		 *	private function flySquaresConfigMode(obj:DisplayObject):void 
		 *	{
		 *		var flySquares:FlySquares = new FlySquares( obj, 10, 1, true, false );
		 *		this.addChild( flySquares  );
		 *		flySquares.x = flySquares.width;
		 *		flySquares.configMode( 3, 15, true);
		 *		
		 *	}
		 * 
		 * </listing>
		 * 
		 * 
		 * @param	minRnd минимальный размер стороны фрагмента ,
		 * @param	maxRnd максимальный размер стороны фрагмента ,
		 * @param	traceParam включить трансляцию основных параметров в трейс.
		 */
		public function configMode(minRnd:uint = 1, maxRnd:uint = 0, traceParam:Boolean = false):void
		{
			_traceParam = traceParam;
			_minRnd = minRnd;
			maxRnd === 0?_maxRnd = _dObject.width:_maxRnd = maxRnd;
			_configMode = true;
			
			_vecSize = selectRndSize();
			
			initalConfigMode();
		}
		
		

		
		/**
		 *  Инициализирует режим отладки при его активации
		 * и при каждой иттерации приложения.
		 */
		private function initalConfigMode():void
		{
			
			if (_sizeFragments.flag === true )
			{
				if ( _vecSize.length === 0 ) _vecSize = selectRndSize();
				_sizeFragments.size =_vecSize.shift() ;
				_cFlySquares.sizeFragments = _sizeFragments.size;
			}
				
				_vFlySquares.addEventListener(MouseEvent.CLICK, flySquaresClickListener);
				
				_tStart = new Timer(20);
				_tStart.addEventListener(TimerEvent.TIMER, timerListener);
				_tStart.start();
				if (_traceParam ) TraceParam();
				if ( !_tRestart ) _tRestart = new Timer(_rate * 1000);
		}
		
		private function selectRndSize():Array
		{
			///подбор диапазона случайных параметров
			var factor:int = 9;
			var unit:Number = ( _maxRnd - _minRnd ) / factor;
			var vecSize:Array = new Array();
			var value:Number = _minRnd;
			
			vecSize.push( value );
			
			while ( vecSize.length < factor )
			{
				value += unit;
				vecSize.push( value );

			}
			
			vecSize.push(_maxRnd);

			return vecSize;
		}
		
		private function TraceParam():void
		{
			
			////////////////////////// T R A C E ///////////////////////////////
			var d:Date = new Date();
			trace(" start time: " + d.valueOf() + "ms . FlySquares, TraceParam, _sizeFragments : " + this.sizeFragments +
			", progress : " + _progress + ", rate : " + _rate + ",  strictMode: " + _strictMode );
			//////////////////////// E N D  T R A C E //////////////////////////
		}
		
		/**
		 *  Пересоздание объекта по клику.
		 * Или удалению со сцены.
		 * @param	e
		 */
		
		private function flySquaresClickListener(e:MouseEvent = null):void 
		{
			_vFlySquares.removeEventListener(MouseEvent.CLICK, flySquaresClickListener);
			_tStart.removeEventListener(TimerEvent.TIMER, timerListener);
			_tStart.reset();
			_tStart = null;
			
			
			init();
		}
		
		
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*								E N D  O F F 	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
	
		private function removeFromStageListener(e:Event):void 
		{
			removeEventListener(Event.REMOVED_FROM_STAGE, removeFromStageListener);
			_cFlySquares.removeEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
			_vFlySquares.removeEventListener(MouseEvent.CLICK, flySquaresClickListener);
		}
		
		
		private function endPlayListener(e:Event):void 
		{
			_cFlySquares.removeEventListener( _cFlySquares.END_PLAY_THIS, endPlayListener);
			
			if ( _configMode === true )
			{
				_tRestart.start();
				_tRestart.addEventListener(TimerEvent.TIMER, init);
				this.dispatchEvent(new Event(FLY_SQUARES_END));
			}
			else
			{
				this.dispatchEvent(new Event(FLY_SQUARES_END));
			}
			
			return;
		}
		
		private function timerListener(e:TimerEvent):void 
		{
			
			this.progress ++;
			
			if ( this.progress >= 100 ) {
				_progress = 0;
				_tStart.reset();
				_tStart.removeEventListener(TimerEvent.TIMER, timerListener);
				
				return;
			}
			
			
		}
		
		
	/**-------------------------------------------------------------------------------
	* 
	* 	
	* 
	*					S E C O N D A R  Y   F U N C T I O N ' S  	
	*
	* 
	* 
	* ------------------------------------------------------------------------------
	*/
		
		private function createShape():void
		{
			var rect:Rectangle = _dObject.getBounds(this);
			var shape:Shape = new Shape();
			shape.graphics.beginFill(0x000000, 0);
			shape.graphics.drawRect( rect.x, rect.y, rect.width, rect.height );
			this.addChild(shape);
		}
		
		
		
	}

}>>>>>>> .r1349
